<?php
namespace app\admin\model;

use think\Model;
use app\admin\model\Menu as MenuModel;
use app\admin\model\Role as RoleModel;

/**
 * 后台用户模型
 * @package app\admin\model
 */
class User extends Model
{
    // 定义时间戳字段名

    protected $createTime = 'ctime';

    protected $updateTime = 'mtime';

    // 自动写入时间戳

    protected $autoWriteTimestamp = true;



    // 对密码进行加密

    public function setPasswordAttr($value)

    {
        return password_hash($value, PASSWORD_DEFAULT);
    }

    // 获取最后登陆ip

    public function setLastLoginIpAttr()

    {
        return get_client_ip();
    }

    /**

     * 删除用户

     * @param string $id 用户ID

     * @author 橘子俊 <364666827@qq.com>

     * @return bool

     */
    public function del($id = 0)
    {
        $menu_model = new MenuModel();
        if (is_array($id)) {
            $error = '';
            foreach ($id as $k => $v) {
                if ($v == ADMIN_ID) {
                    $error .= '不能删除当前登陆的用户['.$v.']！<br>';
                    continue;
                }

                if ($v == 1) {
                    $error .= '不能删除超级管理员['.$v.']！<br>';
                    continue;
                }

                if ($v <= 0) {
                    $error .= '参数传递错误['.$v.']！<br>';
                    continue;
                }

                $map = [];
                $map['id'] = $v;
                // 删除用户

                self::where($map)->delete();

                // 删除关联表;

                $menu_model->delUser($v);

            }

            if ($error) {
                $this->error = $error;
                return false;
            }
        } else {
            $id = (int)$id;
            if ($id <= 0) {
                $this->error = '参数传递错误！';
                return false;
            }

            if ($id == ADMIN_ID) {
                $this->error = '不能删除当前登陆的用户！';
                return false;
            }

            if ($id == 1) {
                $this->error = '不能删除超级管理员！';
                return false;
            }

            $map = [];
            $map['id'] = $id;
            // 删除用户

            self::where($map)->delete();

            // 删除关联表

            $menu_model->delUser($id);

        }

        return true;
    }

    /**

     * 用户登录

     * @param string $username 用户名

     * @param string $password 密码

     * @param bool $remember 记住登录 TODO

     * @author 橘子俊 <364666827@qq.com>

     * @return bool|mixed

     */
    public function login($username = '', $password = '', $remember = false)
    {
        $username = trim($username);
        $password = trim($password);
        $map = [];
        $map['status'] = 1;
        $map['username'] = $username;
        if ($this->validateData(input('post.'), 'AdminUser.login') != true) {
            $this->error = $this->getError();
            return false;
        }

        $user = self::where($map)->find();
        if (!$user) {
            $this->error = '用户不存在或被禁用！';
            return false;
        }

        // 密码校验

        if (!password_verify($password, $user->password)) {

            $this->error = '登陆密码错误！';
            return false;
        }

        // 检查是否分配角色

        if ($user->role_id == 0) {

            $this->error = '禁止访问(原因：未分配角色)！';
            return false;
        }

        // 角色信息

        $role = RoleModel::where('id', $user->role_id)->find()->toArray();

        if (!$role || $role['status'] == 0) {
            $this->error = '禁止访问(原因：角色分组可能被禁用)！';
            return false;
        }

        // 更新登录信息

        $user->last_login_time = time();

        $user->last_login_ip   = get_client_ip();
        if ($user->save()) {
            // 执行登陆

            $login = [];

            $login['uid'] = $user->id;
            $login['role_id'] = $user->role_id;
            $login['role_name'] = $role['name'];
            $login['nick'] = $user->nick;

            // 缓存角色权限

            cache('role_auth_'.$user->role_id, json_decode($role['auth']));



            session('admin_user', $login);
            session('admin_user_sign', $this->dataSign($login));
            return $user->id;
        }
        return false;
    }

    /**

     * 判断是否登录

     * @author 橘子俊 <364666827@qq.com>

     * @return bool|array

     */
    public function isLogin()
    {
        $user = session('admin_user');
        if (isset($user['uid'])) {
            if (!self::where('id', $user['uid'])->find()) {
                return false;
            }
            return session('admin_user_sign') == $this->dataSign($user) ? $user : false;
        }
        return false;
    }

    /**

     * 退出登陆

     * @author 橘子俊 <364666827@qq.com>

     * @return bool

     */
    public function logout()
    {
        session('admin_user', null);
        session('admin_user_sign', null);
    }

    /**

     * 数据签名认证

     * @param array $data 被认证的数据

     * @author 橘子俊 <364666827@qq.com>

     * @return string 签名

     */
    public function dataSign($data = [])
    {
        if (!is_array($data)) {
            $data = (array) $data;
        }
        ksort($data);
        $code = http_build_query($data);
        $sign = sha1($code);
        return $sign;
    }
